草庐IT

LeetCode - 两数之和

全部标签

四数相加II & 赎金信 & 三数之和 & 四数之和

一、四数相加Ⅱ454.四数相加II1.方法概述首先定义一个map,key放a和b两数之和,value放a和b两数之和出现的次数。遍历大A和大B数组,统计两个数组元素之和,和出现的次数,放到map中。定义int变量count,用来统计a+b+c+d=0出现的次数。在遍历大C和大D数组,找到如果0-(c+d)在map中出现过的话,就用count把map中key对应的value也就是出现次数统计出来。最后返回统计值count就可以了。2、具体实现Java实现点击查看代码classSolution{publicintfourSumCount(int[]nums1,int[]nums2,int[]num

leetcode-链表-环形链表2

题干给定一个链表的头节点head,返回链表开始入环的第一个节点。如果链表无环,则返回null。如果链表中有某个节点,可以通过连续跟踪next指针再次到达,则链表中存在环。为了表示给定链表中的环,评测系统内部使用整数pos来表示链表尾连接到链表中的位置(索引从0开始)。如果pos是-1,则在该链表中没有环。注意:pos不作为参数进行传递,仅仅是为了标识链表的实际情况。不允许修改链表。要求空间复杂度O(1)流程分析这个题需要使用快慢指针,即可转换为追赶问题。追赶问题就会存在等式:快的速度=k慢的速度我们假设快指针是满指针速度的两倍,则有:快路程/t=2慢路程/t,即:快路程=慢路程2(1)下面我们

leetcode-链表-环形链表2

题干给定一个链表的头节点head,返回链表开始入环的第一个节点。如果链表无环,则返回null。如果链表中有某个节点,可以通过连续跟踪next指针再次到达,则链表中存在环。为了表示给定链表中的环,评测系统内部使用整数pos来表示链表尾连接到链表中的位置(索引从0开始)。如果pos是-1,则在该链表中没有环。注意:pos不作为参数进行传递,仅仅是为了标识链表的实际情况。不允许修改链表。要求空间复杂度O(1)流程分析这个题需要使用快慢指针,即可转换为追赶问题。追赶问题就会存在等式:快的速度=k慢的速度我们假设快指针是满指针速度的两倍,则有:快路程/t=2慢路程/t,即:快路程=慢路程2(1)下面我们

Leetcode题1两数之和 JavaScript语言

1.两数之和方案一,暴力双循环读完题目,马上能想到的方案就是双循环,挨个排查,写出来也很快:vartwoSum=function(nums,target){constlen=nums.length;for(leti=0;i上面方案,最大的问题就是时间复杂度为O(n^2),所以我们可以想办法在此基础上优化。方案二,空间换时间(Map)方案一的思路是,从头到尾挨个去计算数组中任意两个元素的和,然后与给定结果值进行比较,从而找到目标索引,这就导致必须得进行O(n^2)复杂度的双循环,效率低下。为了干掉双循环,我们不得不转换思考方式,如何才能在一次迭代中就实现题目要求呢。题目本质是找到符合要求的两个数

Leetcode题1两数之和 JavaScript语言

1.两数之和方案一,暴力双循环读完题目,马上能想到的方案就是双循环,挨个排查,写出来也很快:vartwoSum=function(nums,target){constlen=nums.length;for(leti=0;i上面方案,最大的问题就是时间复杂度为O(n^2),所以我们可以想办法在此基础上优化。方案二,空间换时间(Map)方案一的思路是,从头到尾挨个去计算数组中任意两个元素的和,然后与给定结果值进行比较,从而找到目标索引,这就导致必须得进行O(n^2)复杂度的双循环,效率低下。为了干掉双循环,我们不得不转换思考方式,如何才能在一次迭代中就实现题目要求呢。题目本质是找到符合要求的两个数

LeetCode题2两数相加

2.两数相加分析题目比较简单,就是两个数相加求和。按照加法思想,同时遍历两个链表,从个位一直加到最高位即可。比如要计算352+99,步骤如下:最低位2+9得11,需进位,个位保留1,进位1先存储5+9得14,再加上刚刚的进位1,得到15,本位保留5,进位1先存储3+0(注意此时99的位数已经用完了,但是352还有一位,所以这里可以将99的这一位看作0)得3,再加上刚刚的进位1,得到4将前面几步中的数字按照顺序排列,可得到451。观察上述过程,一个容易出错的地方,在于加法进位的处理。另外一个难点,在于位数的处理,两个链表长度不一,结果链表的长度也只有把前面所有位数加完才确定。一种实现functi

LeetCode题2两数相加

2.两数相加分析题目比较简单,就是两个数相加求和。按照加法思想,同时遍历两个链表,从个位一直加到最高位即可。比如要计算352+99,步骤如下:最低位2+9得11,需进位,个位保留1,进位1先存储5+9得14,再加上刚刚的进位1,得到15,本位保留5,进位1先存储3+0(注意此时99的位数已经用完了,但是352还有一位,所以这里可以将99的这一位看作0)得3,再加上刚刚的进位1,得到4将前面几步中的数字按照顺序排列,可得到451。观察上述过程,一个容易出错的地方,在于加法进位的处理。另外一个难点,在于位数的处理,两个链表长度不一,结果链表的长度也只有把前面所有位数加完才确定。一种实现functi

LeetCode题3无重复字符的最长字串

3.无重复字符的最长字串0、分析简单分析一下:要求无重复字符的最长子串的长度。长度值可以用一个变量保存,至于最大长度,只需要在每轮循环中对长度变量值与当前无重复字符的子串长度求最大值即可,那么问题就转变成了如何在循环中找出所有无重复字符的子串。为便于叙述,下文使用s表示原字符串,bs表示子串,ndcs表示无重复字符的子串,lndcs表示最长的无重复字符的子串1、暴力双循环基于以上分析,可以用双循环暴力去解决,下面是一种实现?:functionlengthOfLongestSubstring(s){constn=s.lengthletans=0for(leti=0;i本解法好处是粗暴直观,坏处就

LeetCode题3无重复字符的最长字串

3.无重复字符的最长字串0、分析简单分析一下:要求无重复字符的最长子串的长度。长度值可以用一个变量保存,至于最大长度,只需要在每轮循环中对长度变量值与当前无重复字符的子串长度求最大值即可,那么问题就转变成了如何在循环中找出所有无重复字符的子串。为便于叙述,下文使用s表示原字符串,bs表示子串,ndcs表示无重复字符的子串,lndcs表示最长的无重复字符的子串1、暴力双循环基于以上分析,可以用双循环暴力去解决,下面是一种实现?:functionlengthOfLongestSubstring(s){constn=s.lengthletans=0for(leti=0;i本解法好处是粗暴直观,坏处就

LeetCode-45. 跳跃游戏II - 题解分析

题目来源45.跳跃游戏II题目详情给定一个长度为n的0索引整数数组nums。初始位置为nums[0]。每个元素nums[i]表示从索引i向前跳转的最大长度。换句话说,如果你在nums[i]处,你可以跳转到任意nums[i+j]处:0i+j返回到达 nums[n-1]的最小跳跃次数。生成的测试用例可以到达nums[n-1]。示例1:输入:nums=[2,3,1,1,4]输出:2解释:跳到最后一个位置的最小跳跃数是2。 从下标为0跳到下标为1的位置,跳 1 步,然后跳 3 步到达数组的最后一个位置。示例2:输入:nums=[2,3,0,1,4]输出:2提示:10题目保证可以到达 nums[n-1]